package pen_exam.weipinhui_2024_03_30;

import java.util.Stack;

/**
 * 输入一个字符串，字符串包括数字、英文和英文左右括号，将该字符串反转，反转要求如下：
 * 1）英文左右括号内的内容连同左右括号当成一个整体处理，如果匹配的左右括号内无内容，将左右括号看成一个整体。
 * 2）左右括号必须成对匹配，且左右括号内不能存在无匹配的左括号或右括号,方能看做一个整体。
 * 3）左右括号内再包含匹配成功的左右括号，按照最外层括号看成整体。
 * 4）无匹配的左括号或右括号当成一个单一元素处理，和数字、英文处理逻辑一致。
 * 5）括号匹配成功必须是先左括号后右括号。
 * 如输入 abcd 返回 dcba
 *    输入 abcd(efg  返回 gfe(dcba
 *    输入 abcd(efg) 返回 (efg)dcba
 *    输入 如abc(efg(dfg)) 返回 (efg(dfg))cba  （每个左括号都有右括号匹配，按照最外层匹配括号看成一个整体）
 *    输入 abc(efg(dfg)  返回(dfg)gfe(cba    (由于第一个左括号无右括号匹配)
 *    输入 )abcd(  返回(dcba)    (由于第一个左括号无右括号匹配,最后一个右括号无左括号匹配)
 *
 * */
public class Class02_Reverse {
    public static String revert (String input) {
        char[] str = input.toCharArray();
        int mostLeft = -1;
        int mostRight = -1;
        int n = input.length();
        Stack<Integer> stack = new Stack<>();
        for(int i = 0; i < str.length;i++){
            if(str[i] == '('){
                stack.push(i);
            }
            if(str[i] == ')'){
                mostLeft = stack.pop();
                mostRight = i;
            }
        }
        if(mostLeft != -1 && mostRight != -1){
            reverse(str,mostLeft,mostRight);
        }
        reverse(str,0,str.length - 1);
        return new String(str);
    }
    public static void reverse(char[] str,int i,int j) {
        while (i < j) {
            char temp = str[i];
            str[i] = str[j];
            str[j] = temp;
            i++;
            j--;
        }
    }

    public static void main(String[] args) {
        String str = "abcd(efg)";
        revert(str);
    }

}
